// src/main/utils/permissionManager.js

const { dialog, shell } = require('electron')
const path = require('path')
const fs = require('fs').promises

/**
 * 权限管理工具类
 * 处理不同平台的权限请求、检查和提示
 */
class PermissionManager {
  constructor() {
    this.platform = process.platform
    this.permissionCache = new Map()
  }

  /**
   * 检查文件读取权限
   * @param {string} filePath - 文件路径
   * @returns {Promise<boolean>}
   */
  async checkFileReadPermission(filePath) {
    const cacheKey = `read_${filePath}`
    
    if (this.permissionCache.has(cacheKey)) {
      return this.permissionCache.get(cacheKey)
    }

    try {
      await fs.access(filePath, fs.constants.R_OK)
      this.permissionCache.set(cacheKey, true)
      return true
    } catch (error) {
      console.log('[PermissionManager] 文件读取权限检查失败:', filePath, error.message)
      this.permissionCache.set(cacheKey, false)
      return false
    }
  }

  /**
   * 检查目录写入权限
   * @param {string} dirPath - 目录路径
   * @returns {Promise<boolean>}
   */
  async checkDirectoryWritePermission(dirPath) {
    const cacheKey = `write_${dirPath}`
    
    if (this.permissionCache.has(cacheKey)) {
      return this.permissionCache.get(cacheKey)
    }

    try {
      // 尝试创建临时文件来测试写入权限
      const testFile = path.join(dirPath, '.test_write_permission')
      await fs.writeFile(testFile, 'test')
      await fs.unlink(testFile)
      this.permissionCache.set(cacheKey, true)
      return true
    } catch (error) {
      console.log('[PermissionManager] 目录写入权限检查失败:', dirPath, error.message)
      this.permissionCache.set(cacheKey, false)
      return false
    }
  }

  /**
   * 请求文件访问权限（macOS）
   * @param {string} filePath - 文件路径
   * @returns {Promise<boolean>}
   */
  async requestFileAccessPermission(filePath) {
    if (this.platform !== 'darwin') {
      return true // 非 macOS 平台不需要特殊权限请求
    }

    console.log('[PermissionManager] 请求文件访问权限:', filePath)
    
    try {
      // 在 macOS 上，通过尝试访问文件来触发系统权限对话框
      await fs.access(filePath, fs.constants.R_OK)
      return true
    } catch (error) {
      console.log('[PermissionManager] 文件访问权限请求失败:', error.message)
      
      // 显示权限说明对话框
      const result = await this.showPermissionDialog(filePath)
      if (result) {
        // 用户确认后再次尝试
        try {
          await fs.access(filePath, fs.constants.R_OK)
          return true
        } catch {
          return false
        }
      }
      return false
    }
  }

  /**
   * 显示权限说明对话框
   * @param {string} filePath - 文件路径
   * @returns {Promise<boolean>}
   */
  async showPermissionDialog(filePath) {
    const options = {
      type: 'info',
      title: '需要文件访问权限',
      message: '应用需要访问文件才能正常工作',
      detail: `请在弹出的系统对话框中允许访问：\n${filePath}`,
      buttons: ['确定', '取消'],
      defaultId: 0
    }

    const result = await dialog.showMessageBox(options)
    return result.response === 0
  }

  /**
   * 检查并请求必要的权限
   * @param {Array<string>} filePaths - 文件路径数组
   * @returns {Promise<Array<string>>} 有权限访问的文件路径数组
   */
  async checkAndRequestPermissions(filePaths) {
    console.log('[PermissionManager] 检查文件权限:', filePaths)
    
    const accessibleFiles = []
    
    for (const filePath of filePaths) {
      // 检查文件是否存在
      if (!await this.fileExists(filePath)) {
        console.log('[PermissionManager] 文件不存在:', filePath)
        continue
      }

      // 请求访问权限
      if (await this.requestFileAccessPermission(filePath)) {
        accessibleFiles.push(filePath)
        console.log('[PermissionManager] 文件权限检查通过:', filePath)
      } else {
        console.log('[PermissionManager] 文件权限检查失败:', filePath)
      }
    }

    return accessibleFiles
  }

  /**
   * 检查文件是否存在
   * @param {string} filePath - 文件路径
   * @returns {Promise<boolean>}
   */
  async fileExists(filePath) {
    try {
      await fs.access(filePath)
      return true
    } catch {
      return false
    }
  }

  /**
   * 获取权限状态信息
   * @param {string} filePath - 文件路径
   * @returns {Promise<Object>}
   */
  async getPermissionStatus(filePath) {
    const exists = await this.fileExists(filePath)
    const readable = await this.checkFileReadPermission(filePath)
    
    return {
      exists,
      readable,
      accessible: exists && readable
    }
  }

  /**
   * 清除权限缓存
   */
  clearPermissionCache() {
    this.permissionCache.clear()
    console.log('[PermissionManager] 权限缓存已清除')
  }

  /**
   * 显示权限帮助信息
   */
  async showPermissionHelp() {
    const helpMessage = this.platform === 'darwin' 
      ? '在 macOS 上，您需要在"系统偏好设置 > 安全性与隐私 > 隐私 > 文件和文件夹"中允许应用访问文件。'
      : this.platform === 'win32'
      ? '在 Windows 上，请确保应用有足够的权限访问文件。'
      : '在 Linux 上，请确保文件权限设置正确。'

    await dialog.showMessageBox({
      type: 'info',
      title: '权限帮助',
      message: '文件访问权限说明',
      detail: helpMessage,
      buttons: ['确定']
    })
  }

  /**
   * 验证目录权限
   * @param {string} dirPath - 目录路径
   * @returns {Promise<Object>}
   */
  async validateDirectoryPermissions(dirPath) {
    const exists = await this.fileExists(dirPath)
    const writable = await this.checkDirectoryWritePermission(dirPath)
    
    return {
      exists,
      writable,
      valid: exists && writable
    }
  }
}

module.exports = PermissionManager 